package top.ahzy.seobench.result;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * 返回模型
 *
 * @author ahzy
 */
@Data
@ApiModel(value = "返回模型", description = "")
public class Result<T> {

    public static final String success = "操作成功";
    public static final String error = "操作失败";

    /**
     * 状态码
     */
    @ApiModelProperty("状态码")
    private int code;

    /**
     * 返回内容
     */
    @ApiModelProperty("消息")
    private String message;

    /**
     * 数据对象
     */
    @ApiModelProperty("数据对象")
    private T data;

    /**
     * 初始化一个新创建的 Result 对象，使其表示一个空消息。
     */
    public Result() {
    }

    /**
     * 初始化一个新创建的 Result 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     */
    public Result(int code, String msg) {
        this.code = code;
        this.message = msg;
    }

    /**
     * 初始化一个新创建的 Result 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     * @param data 数据对象
     */
    public Result(int code, String msg, T data) {
        this.code = code;
        this.message = msg;
        if (ObjectUtil.isNotEmpty(data)) {
            this.data = data;
        }
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static Result success() {
        return Result.success("操作成功");
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static Result success(Object data) {
        return Result.success(success, data);
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public Result successInstanceof(T data) {
        if (data instanceof Page) {
            Page<T> page = (Page<T>) data;
            return success(new ResultList<T>(page));
        }

        return success(data);
    }

    /**
     * bean集合转换响应
     *
     * @param data
     * @param targetType
     * @param <E>
     * @return
     */
    public <E> Result successBeanCopyPage(T data, Class<E> targetType) {
        if (data instanceof Page) {
            Page<T> page = (Page<T>) data;
            List<E> list = BeanUtil.copyToList(page.getRecords(), targetType);
            ResultList<E> resultList = new ResultList<>();
            resultList.setList(list);
            resultList.setTotal(page.getTotal());
            return Result.success(resultList);
        }

        return Result.success(data);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     */
    public static Result success(String msg) {
        return Result.success(msg, null);
    }

    /**
     * 返回成功消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static Result success(String msg, Object data) {
        return new Result(HttpStatus.HTTP_OK, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @return
     */
    public static Result error() {
        return Result.error(error);
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static Result error(String msg) {
        return Result.error(msg, null);
    }

    /**
     * 返回错误消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static Result error(String msg, Object data) {
        return new Result(HttpStatus.HTTP_INTERNAL_ERROR, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @param code 状态码
     * @param msg  返回内容
     * @return 警告消息
     */
    public static Result error(int code, String msg) {
        return new Result(code, msg, null);
    }

    /**
     * 判断当前信息是否是成功消息
     *
     * @return 警告消息
     */
    public static boolean isSuccess(Result result) {
        return result.code == HttpStatus.HTTP_OK;
    }

    /**
     * 判断当前信息是否是成功消息
     *
     * @return 警告消息
     */
    public static boolean isNotSuccess(Result result) {
        return !isSuccess(result);
    }

    /**
     * 获取数据
     *
     * @return 警告消息
     */
    public T getData() {
        return this.data;
    }

    /**
     * 获取消息
     *
     * @return 消息
     */
    public String getMessage() {
        return this.message;
    }
}
